package com.rivulet.doj_backend.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.rivulet.doj_backend.config.SecurityConfig;
import com.rivulet.doj_backend.config.bean.OnlineUser;
import com.rivulet.doj_backend.mapper.EmailMapper;
import com.rivulet.doj_backend.mapper.admin.UserMapper;
import com.rivulet.doj_backend.pojo.*;
import com.rivulet.doj_backend.pojo.request.business.LoginRequest;
import com.rivulet.doj_backend.service.UserService;
import com.rivulet.doj_backend.tools.JwtUtil;
import com.rivulet.doj_backend.tools.ResultFul;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    UserMapper userMapper;
    @Autowired
    EmailMapper emailMapper;
    @Autowired
    private AuthenticationManager authenticationManager;


    @Override
    public ResultFul login(LoginRequest loginRequest) {
        // 将表单数据封装到 UsernamePasswordAuthenticationToken
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword());
        // authenticate方法会调用loadUserByUsername
        Authentication authenticate = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
        if (Objects.isNull(authenticate)) {
            throw new RuntimeException("用户名或密码错误");
        }
        // 校验成功，强转对象
        OnlineUser onlineUser = (OnlineUser) authenticate.getPrincipal();
        // 校验通过返回token
        String token = JwtUtil.createToken(onlineUser.getId(), onlineUser.getUsername());
        Map<String, Object> map = new HashMap<>();
        map.put("token", token);
        return new ResultFul<>(200, map);
    }

//    @Override
//    public Integer userLogin(User user) {
//        Integer result = 404;
//        try {
//            User realUser = userMapper.getUserByUsername(user.getUsername());
//            if (realUser == null) {
//                result = 401;
//            } else if (realUser.getPassword().equals(user.getPassword())) {
//                result = 100;
//            } else {
//                result = 400;
//            }
//        } catch (Exception e) {
//            System.out.println("登录异常" + e.toString());
//        } finally {
//            return result;
//        }
//    }
//
//    @Override
//    public Integer userRegister(User user, String code) {
//        Integer result = 404;
//        try {
//            String realCode = emailMapper.getEmailCheckCode(user.getUsername());
//            if (userMapper.getUserIdByUsername(user.getUsername()) == null && realCode.equals(code)) {
//                result = 100;
//                userMapper.setUser(user.getUsername(), user.getPassword(), 1);
//                userMapper.setUserInformation(user.getUsername());
//            } else if (!realCode.equals(code)) {
//                result = 401;
//            }
//        } catch (Exception e) {
//            System.out.println(e);
//        } finally {
//            return result;
//        }
//    }
//
//    @Override
//    public Integer userAdd(User user) {
//        Integer result = 404;
//        try {
//            User realUser = userMapper.getUserByUsername(user.getUsername());
//            if (realUser == null) {
//                String userName = user.getUsername();
//                String password = user.getPassword();
//                Integer identity = user.getIdentity();
//                System.out.println(userName);
//                System.out.println(password);
//                System.out.println(identity);
//                userMapper.setUser(userName, password, identity);
//                result = 100;
//            } else {
//                result = 400;
//            }
//        } catch (Exception e) {
//            System.out.println("添加异常" + e.toString());
//        } finally {
//            return result;
//        }
//    }
//
//    @Override
//    public Integer userSeek(Integer id) {
//        int result = 404;
//        try {
//            User realUser = userMapper.getUserByUserId(id);
//            if (realUser == null) {
//                result = 401;
//            } else {
//                result = 100;
//            }
//        } catch (Exception e) {
//            System.out.println(e);
//        } finally {
//            return result;
//        }
//    }
//
//    @Override
//    public User userSelect(Integer id) {
//        User realUser = null;
//        try {
//            realUser = userMapper.getUserByUserId(id);
//        } catch (Exception e) {
//            System.out.println("查询异常" + e.toString());
//        } finally {
//            return realUser;
//        }
//    }
//
//
//    @Override
//    public Integer userDelete(Integer id) {
//        int result = 404;
//        try {
//            System.out.println(id);
//            User realUser = userMapper.getUserByUserId(id);
//            if (realUser == null) {
//                result = 401;
//            } else {
//                System.out.println(id);
//                userMapper.delUserByUserId(id);
//                result = 100;
//            }
//        } catch (Exception e) {
//            System.out.println(e);
//        } finally {
//            return result;
//        }
//    }
//
//    @Override
//    public Integer userChange(User user) {
//        int result = 404;
//        try {
//            User realUser = userMapper.getUserByUsername(user.getUsername());
//            if (realUser.getPassword().equals(user.getPassword())) {
//                userMapper.updateUser(user.getUser_id(), user.getUsername(), user.getPassword(), user.getIdentity());
//                result = 100;
//            } else if (realUser == null) {
//                result = 401;
//            } else result = 400;
//        } catch (Exception e) {
//            System.out.println(e);
//        } finally {
//            return result;
//        }
//    }
//
//    /**
//     * 这个校验是依据session key查询用户
//     * 为了减少内存压力，计划把数据以key-value形式存在数据库中
//     * 适用于这种大量反复查询的情况下，应该使用非关系数据库
//     * 例如redis,但是本人并不想在电脑上安装redis,
//     * 是故开发阶段，此方案仅用查询mysql的方式处理
//     *
//     * @param session
//     * @return
//     */
//    @Override
//    public User checkSession(String session) {
//        String userString = String.valueOf(redisTemplate.opsForValue().get(session));
//        User user = JSONObject.parseObject(userString, User.class);
//        return user;
//    }
}
